﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace MakeIT.Deo.Negocios
{
    public class OrcamentoItemBO
    {

        private deoEntities modelo = null;

        public OrcamentoItemBO()
        {
            modelo = new deoEntities();
        }

        /// <summary>
        /// Recupera todos os registros de banco
        /// </summary>
        /// <returns></returns>
        public List<orcamentoitem> RecuperaOrcamentoItem()
        {
            return this.RecuperaOrcamentoItem(null, null, null);
        }

        /// <summary>
        /// Recupera Orcamentos através do idOrcamento
        /// </summary>
        /// <param name="idOrcamento"></param>
        /// <returns></returns>
        public orcamentoitem RecuperaOrcamentoItem(int? idOrcamentoItem)
        {
            // declara objetos
            List<orcamentoitem> listaOrcamentoItem = null;

            listaOrcamentoItem = this.RecuperaOrcamentoItem(idOrcamentoItem, null, null);

            if (listaOrcamentoItem != null && listaOrcamentoItem.Count>0)
            {
                return listaOrcamentoItem[0];
            }
            else
            {
                return null;
            }

        }

        /// <summary>
        /// Recupera uma Lista de OrcamentoItenss através do Título e do Código    
        /// </summary>
        /// <param name="titulo"></param>
        /// <param name="idOrcamentoItens"></param>
        /// <returns></returns>
        public List<orcamentoitem> RecuperaOrcamentoItem(int? idOrcamentoItem, int? idOrcamento, int? idProduto)
        {
            // declara objetos
            IQueryable<orcamentoitem> query = modelo.orcamentoitem;

            try
            {

                // Verifica se o código da idOrcamentoItens é diferente de nulo
                if (idOrcamentoItem != null)
                {
                    // monta query dinamica
                    query = query.Where(a => a.IdOrcamentoItem == idOrcamentoItem);
                }

                // Verifica se o código da idOrcamentoItens é diferente de nulo
                if (idOrcamento != null)
                {
                    // monta query dinamica
                    query = query.Where(a => a.IdOrcamento == idOrcamento);
                }

                // Verifica se o código da idCliente é diferente de nulo
                if (idProduto != null)
                {
                    // monta query dinamica
                    query = query.Where(a => a.IdProduto == idProduto);
                }


                var retornaLista = from orc in query
                                   orderby orc.IdProduto
                                   select orc;

                if (retornaLista!=null && retornaLista.Count() > 0)
                {
                    return retornaLista.ToList();

                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        /// <summary>
        /// Excluir um determinado registro 
        /// </summary>
        /// <param name="entidade">Registro a ser excluido</param>
        /// <param name="msg"></param>
        /// <returns>Retorna uma msg quando há, a qual sinaliza algum fluxo alternativo</returns>
        public void DeletaOrcamentoItem(orcamentoitem entidade)
        {
            try
            {
                EntityKey key = new EntityKey(modelo.DefaultContainerName + ".orcamentoitem", "IdOrcamentoItem", entidade.IdOrcamentoItem);
                modelo.DeleteObject(modelo.GetObjectByKey(key));
                modelo.SaveChanges();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void DeletaOrcamentoItens(List<orcamentoitem> entidades)
        {
            if (entidades != null)
                foreach (orcamentoitem entidade in entidades)
                    DeletaOrcamentoItem(entidade);
        }


        /// <summary>
        /// Salva um novo registro ou atualiza um já existente 
        /// </summary>
        /// <param name="entidade"></param>
        /// <param name="novo"></param>
        public void SalvaOrcamentoItem(orcamentoitem entidade, Boolean novo)
        {
            try
            {

                //Verifica se é um registro novo
                if (novo)
                {
                    //Adiciona um novo registro
                    modelo.AddToorcamentoitem(entidade);
                }
                else
                { 
                    //Efetiva as mudanças na entidade já existente
                    modelo.ApplyPropertyChanges(entidade.EntityKey.EntitySetName, entidade);
                }

                //Efetiva as mudancas já existentes
                modelo.SaveChanges();

            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

 
    }
}
